from itertools import product
def all_graphs_for(n):
nodes = list(range(n))
index_to_edge = {}
num_edges = 0
for i in range(n):
for j in range(i + 1, n):
index_to_edge[num_edges] = (i, j)
num_edges += 1
all_edges = []
for directions in product([0, 1], repeat=num_edges):
edges = {}
for i, direction in enumerate(directions):
edges[index_to_edge[i]] = direction
all_edges.append(edges)
return nodes, all_edges
for i in range(2, 8):
print(i, len(list(all_graphs_for(i)[1])), 2 ** ((i * (i - 1)) // 2))
assert(len(list(all_graphs_for(i)[1])) == 2 ** ((i * (i - 1)) // 2))
2 2 2 3 8 8 4 64 64 5 1024 1024 6 32768 32768 7 2097152 2097152
from itertools import permutations
def is_equal(nodes1, edges1, nodes2, edges2):
def direction(u, v, edges):
if u < v:
return edges[(u, v)]
else:
return 0 if edges[(v, u)] else 1
for i in range(len(nodes1)):
for j in range(i + 1, len(nodes1)):
u, v = nodes1[i], nodes1[j]
dir1 = direction(nodes1[i], nodes1[j], edges1)
dir2 = direction(nodes2[i], nodes2[j], edges2)
if dir1 != dir2:
return False
return True
def is_isometric(nodes, edges1, edges2):
return any(is_equal(nodes, edges1, node_perm, edges2) for node_perm in permutations(nodes))
def count_unique(n):
nodes, graphs = all_graphs_for(n)
groups = {}
merged = [False] * len(graphs)
for i in range(len(graphs)):
if merged[i]:
continue
merged[i] = True
groups[i] = {i}
for j in range(i + 1, len(graphs)):
if merged[j]:
continue
if is_isometric(nodes, graphs[i], graphs[j]):
groups[i].add(j)
merged[j] = True
return len(groups)
for i in range(7):
print(i, count_unique(i))
0 1 1 1 2 1 3 2 4 4 5 12
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-30-68ceb4badcb4> in <module> 1 for i in range(7): ----> 2 print(i, count_unique(i)) <ipython-input-26-3170bb933d0e> in count_unique(n) 12 if merged[j]: 13 continue ---> 14 if is_isometric(nodes, graphs[i], graphs[j]): 15 groups[i].add(j) 16 merged[j] = True <ipython-input-28-f84734544ec3> in is_isometric(nodes, edges1, edges2) 17 18 def is_isometric(nodes, edges1, edges2): ---> 19 return any(is_equal(nodes, edges1, node_perm, edges2) for node_perm in permutations(nodes)) <ipython-input-28-f84734544ec3> in <genexpr>(.0) 17 18 def is_isometric(nodes, edges1, edges2): ---> 19 return any(is_equal(nodes, edges1, node_perm, edges2) for node_perm in permutations(nodes)) <ipython-input-28-f84734544ec3> in is_equal(nodes1, edges1, nodes2, edges2) 10 for j in range(i + 1, len(nodes1)): 11 u, v = nodes1[i], nodes1[j] ---> 12 dir1 = direction(nodes1[i], nodes1[j], edges1) 13 dir2 = direction(nodes2[i], nodes2[j], edges2) 14 if dir1 != dir2: <ipython-input-28-f84734544ec3> in direction(u, v, edges) 2 3 def is_equal(nodes1, edges1, nodes2, edges2): ----> 4 def direction(u, v, edges): 5 if u < v: 6 return edges[(u, v)] KeyboardInterrupt:
def count_unique_prog(n):
nodes, graphs = all_graphs_for(n)
groups = {}
merged = [False] * len(graphs)
for i in range(len(graphs)):
print(i)
if merged[i]:
continue
merged[i] = True
groups[i] = {i}
for j in range(i + 1, len(graphs)):
if merged[j]:
continue
if is_isometric(nodes, graphs[i], graphs[j]):
groups[i].add(j)
merged[j] = True
return len(groups)
print(6, count_unique_prog(6))
0
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-31-4f740a75ae7c> in <module> 17 merged[j] = True 18 return len(groups) ---> 19 print(6, count_unique_prog(6)) <ipython-input-31-4f740a75ae7c> in count_unique_prog(n) 13 if merged[j]: 14 continue ---> 15 if is_isometric(nodes, graphs[i], graphs[j]): 16 groups[i].add(j) 17 merged[j] = True <ipython-input-28-f84734544ec3> in is_isometric(nodes, edges1, edges2) 17 18 def is_isometric(nodes, edges1, edges2): ---> 19 return any(is_equal(nodes, edges1, node_perm, edges2) for node_perm in permutations(nodes)) <ipython-input-28-f84734544ec3> in <genexpr>(.0) 17 18 def is_isometric(nodes, edges1, edges2): ---> 19 return any(is_equal(nodes, edges1, node_perm, edges2) for node_perm in permutations(nodes)) KeyboardInterrupt:
graphs[7]
{(0, 1): 1, (0, 2): 1, (1, 2): 1}